package com.example.demo.tools;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Calendar;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Mr.Xi
 * Date: 2023-04-14
 * Time: 23:42
 */
@Slf4j
public class JWTUtils {
    // 秘钥
    private static final String TOKEN_KEY = "!U@412#^%*AE&F81056DF$^$UIK!!*(JUY)74#@FJG_IQ&JFF%";
    // jwt 载荷中的 key
    private static final String TOKEN_NAME = "LOGIN_USER";
    // token 有效时间（秒）
    private static final Integer TIME = 24*60*60*7;        // 默认 7 天免登录

    /**
     * 生成 token
     * @param map 一些用户的基本信息
     * @return    生成的 token 字符串 ; null 生成失败
     */
    public static String createToken(Map<String,Object> map) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,TIME);
        String token = JWT.create()
                .withClaim(TOKEN_NAME, map)                   // 载荷
                .withExpiresAt(calendar.getTime())            // 设置过期时间  7 天有效
                .sign(Algorithm.HMAC256(TOKEN_KEY));          // 签名
        return token;
    }

    /**
     * 验证 token
     * @param token  token
     * @return       true token 有效 ; 无效就会抛出一个异常
     */
    public static Boolean verifyToken(String token) {
        Map<String, Object> map = JWT.require(Algorithm.HMAC256(TOKEN_KEY)).build().verify(token).getClaim(TOKEN_NAME).asMap();
        return map != null;
    }

    /**
     * 获取 token 中的用户基本信息
     * @param token  token
     * @return       Map<String,Object> 用户基本信息 ; 在进行这一步之前一定会执行 token 验证,所以必然成功!
     */
    public static Map<String,Object> getData(String token) {
        return JWT.require(Algorithm.HMAC256(TOKEN_KEY)).build().verify(token).getClaim(TOKEN_NAME).asMap();
    }
}
